package com.zzyang.c2c.social.govern.report.service.impl;

import com.zzyang.c2c.social.govern.report.dao.ReportTaskDAO;
import com.zzyang.c2c.social.govern.report.dao.ReportTaskVoteDAO;
import com.zzyang.c2c.social.govern.report.domain.ReportTask;
import com.zzyang.c2c.social.govern.report.domain.ReportTaskVote;
import com.zzyang.c2c.social.govern.report.service.ReportTaskVetoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * TODO
 *
 * @author zhuoziyang
 * @date 2021/7/27 21:22
 */
@Service
public class ReportTaskVetoServiceImpl implements ReportTaskVetoService {

    @Autowired
    private ReportTaskVoteDAO reportTaskVetoDAO;

    @Autowired
    private ReportTaskDAO reportTaskDAO;

    @Override
    public void add(ReportTaskVote reportTaskVeto) {
        reportTaskVetoDAO.add(reportTaskVeto);
    }

    @Override
    public void initVote(List<Long> reviewerIds, Long reportTaskId) {
        for (Long reviewerId : reviewerIds) {
            ReportTaskVote reportTaskVeto = new ReportTaskVote();
            reportTaskVeto.setReportTaskId(reportTaskId)
                    .setReviewerId(reviewerId)
                    .setVoteResult(ReportTaskVote.UNKNOWN);
            reportTaskVetoDAO.add(reportTaskVeto);
        }
    }

    @Override
    public void vote(ReportTaskVote reportTaskVeto) {
        reportTaskVetoDAO.update(reportTaskVeto);
    }

    @Override
    public boolean calculateVotes(Long reportTaskId) {
        List<ReportTaskVote> reportTaskVotes = reportTaskVetoDAO.selectAllByReportTaskId(reportTaskId);

        //多数投票
        Integer quorum = reportTaskVotes.size() / 2 + 1;

        Integer approvedCount = 0;
        Integer unapprovedCount = 0;

        for (ReportTaskVote reportTaskVeto : reportTaskVotes) {
            if (ReportTaskVote.APPROVED.equals(reportTaskVeto.getVoteResult())) {
                approvedCount++;
            } else if (ReportTaskVote.UNAPPROVED.equals(reportTaskVeto.getVoteResult())) {
                unapprovedCount++;
            }
        }

        if (approvedCount >= quorum) {
            reportTaskDAO.updateVetoResultById(reportTaskId, ReportTask.VOTE_RESULT_APPROVED);
            return true;
        } else if (unapprovedCount >= quorum) {
            reportTaskDAO.updateVetoResultById(reportTaskId, ReportTask.VOTE_RESULT_UNAPPROVED);
            return true;
        }

        return false;
    }

    @Override
    public List<ReportTaskVote> queryByReportTaskId(Long reportTaskId) {
        return reportTaskVetoDAO.selectAllByReportTaskId(reportTaskId);
    }

}
